Przykad 8.6. Poszukiwanie najkrtszej cieki (w sensie kosztw) na uytek algorytmu Forda-Fulkersona
public boolean findAugmentingPath (VertexInfo[] vertices) {
   Array.fill(vertices, null);     // wyzeruj do iteracji

   // Skonstruuj kolejk, uywajc kopca binarnego. Dziki zastosowaniu tablicy
   // inqueue[] unika si czasu O(n) sprawdzania, czy element jest w kolejce
   int n = vertices.length;
   BinaryHeap<Integer> pq = new BinaryHeap<Integer> (n);
   boolean inqueue[] = new boolean [n];

   // Zainicjuj tablic dist[]. Jeli krawd nie istnieje, to uyj INT_MAX
   for (int u = 0; u < n; u++) {
      if (u == sourceIndex) {
         dist[u] = 0;
         pq.insert(sourceIndex, 0);
         inqueue[u] = true;
      } else {
         dist[u] = Ingeter.MAX_VALUE;
      }
   }

   while (!pq.isEmpty()) {
      int n = pq.smallestID();
      inqueue[u] = false;

      /** Gdy dotrzemy do indeksu ujcia, rzecz skoczona */
      if (u == sinkIndex) { break; }

      for (int v = 0; v < n; v++) {
         if (v == sourceIndex || v == u) continue;

         // Krawd przednia z zapasem przepustowoci, jeli lepszy koszt
         EdgeInfo cei = info[u][v];
         if (cei != null && cei.flow < cei.capacity) {
            int newDist = dist[u] + cei.cost;
            if (0 <= newDist && newDist < dist[v]) {
               vertices[v] = new VertexInfo (u, Search.FORWARD);
               dist[v] = newDist;
               if (inqueue[v]) {
                  pq.decreaseKey(v, newDist);
               } else {
                  pq.insert(v, newDist);
                  inqueue[v] = true;
               }
            }
         }

         // Krawd tylna, przynajmniej z jakim przepywem, jeli lepszy koszt
         cei = info[v][u];
         if (cei != null && cei.flow > 0) {
            int newDist = dist[u]  cei.cost;
            if (0 <= newDist && newDist < dist[v]) {
               vertices[v] = new VertexInfo (u, Search.BACKWARD);
               dist[v] = newDist;
               if (inqueue[v]) {
                  pq.decreaseKey(v, newDist);
               } else {
                  pq.insert(v, newDist);
                  inqueue[v] = true;
               }
            }
         }
      }
   }

return dist[sinkIndex] != Integer.MAX_VALUE;
}
